<?php if (!defined('LIMONATA')) exit('No direct script access allowed');
/**
 * $Rev: 31 $
 * $Date: 2011-09-25 11:32:24 +0000 (Sun, 25 Sep 2011) $
 * $URL: http://limonata.googlecode.com/svn/trunk/application/system/core/gettext/streams.php $
 */

/*
 Copyright (c) 2003, 2005, 2006, 2009 Danilo Segan <danilo@kvota.net>.

 This file is part of PHP-gettext.

 PHP-gettext is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation; either version 2 of the License, or
 (at your option) any later version.

 PHP-gettext is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.

 You should have received a copy of the GNU General Public License
 along with PHP-gettext; if not, write to the Free Software
 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

 */

// Simple class to wrap file streams, string streams, etc.
// seek is essential, and it should be byte stream
class StreamReader
{
	// should return a string [FIXME: perhaps return array of bytes?]
	function read( $bytes )
	{
		return false;
	}
	
	// should return new position
	function seekto( $position )
	{
		return false;
	}
	
	// returns current position
	function currentpos()
	{
		return false;
	}
	
	// returns length of entire stream (limit for seekto()s)
	function length()
	{
		return false;
	}
}

class StringReader
{
	var $_pos;
	var $_str;
	
	function StringReader( $str = '' )
	{
		$this->_str = $str;
		$this->_pos = 0;
	}
	
	function read( $bytes )
	{
		$data = substr( $this->_str, $this->_pos, $bytes );
		$this->_pos += $bytes;
		if ( strlen( $this->_str ) < $this->_pos )
			$this->_pos = strlen( $this->_str );
		
		return $data;
	}
	
	function seekto( $pos )
	{
		$this->_pos = $pos;
		if ( strlen( $this->_str ) < $this->_pos )
			$this->_pos = strlen( $this->_str );
		return $this->_pos;
	}
	
	function currentpos()
	{
		return $this->_pos;
	}
	
	function length()
	{
		return strlen( $this->_str );
	}
	
}


class FileReader
{
	var $_pos;
	var $_fd;
	var $_length;
	
	function FileReader( $filename )
	{
		if ( file_exists( $filename ) ) {
			$this->_length = filesize( $filename );
			$this->_pos    = 0;
			$this->_fd     = fopen( $filename, 'rb' );
			if ( !$this->_fd ) {
				$this->error = 3; // Cannot read file, probably permissions
				return false;
			}
		} else {
			$this->error = 2; // File doesn't exist
			return false;
		}
	}
	
	function read( $bytes )
	{
		if ( $bytes ) {
			fseek( $this->_fd, $this->_pos );
			
			// PHP 5.1.1 does not read more than 8192 bytes in one fread()
			// the discussions at PHP Bugs suggest it's the intended behaviour
			$data = '';
			while ( $bytes > 0 ) {
				$chunk = fread( $this->_fd, $bytes );
				$data .= $chunk;
				$bytes -= strlen( $chunk );
			}
			$this->_pos = ftell( $this->_fd );
			
			return $data;
		} else
			return '';
	}
	
	function seekto( $pos )
	{
		fseek( $this->_fd, $pos );
		$this->_pos = ftell( $this->_fd );
		return $this->_pos;
	}
	
	function currentpos()
	{
		return $this->_pos;
	}
	
	function length()
	{
		return $this->_length;
	}
	
	function close()
	{
		fclose( $this->_fd );
	}
	
}

// Preloads entire file in memory first, then creates a StringReader
// over it (it assumes knowledge of StringReader internals)
class CachedFileReader extends StringReader
{
	function CachedFileReader( $filename )
	{
		if ( file_exists( $filename ) ) {
			$length = filesize( $filename );
			$fd     = fopen( $filename, 'rb' );
			
			if ( !$fd ) {
				$this->error = 3; // Cannot read file, probably permissions
				return false;
			}
			$this->_str = fread( $fd, $length );
			fclose( $fd );
			
		} else {
			$this->error = 2; // File doesn't exist
			return false;
		}
	}
}


/* End of file streams.php */
/* Location: ./system/core/gettext/streams.php */